#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 016_perfect_number.py
@time: 2024/12/16  16:28
# @describe:
"""

"""
一个数如果恰好等于它的因子之和，这个数就称为"完数"。例如6=1＋2＋3.编程找出1000以内的所有完数。
  完数就是除了自身之外的所有约数之和等于他本身。
  第一个完全数是6，它有约数1、2、3、6，除去它本身6外，其余3个数相加，1+2+3=6。
  第二个完全数是28，它有约数1、2、4、7、14、28，除去它本身28外，其余5个数相加，1+2+4+7+14=28。
"""
def perfect_number():
    for num in range(1, 1000):
        arr = []
        # 遍历1到num-1之间的所有数，检查它们是否是num的除数
        for i in range(1, num):
            if num%i == 0:
                arr.append(i)
        # 如果num的所有除数之和等于num本身，则打印num和它的除数列表
        if sum(arr) == num:
            print(num, arr)


perfect_number()



# 使用欧几里得-欧拉定理
def perfect_number1():
    for num in range(1, 1000):
        # 初始化除数和为 0
        divisor_sum = 0
        # 遍历 1 到 num//2 之间的所有数，检查它们是否是 num 的除数
        for i in range(1, num // 2 + 1):
            if num % i == 0:
                divisor_sum += i
        # 如果除数和等于num本身，则打印num和它的除数
        if divisor_sum == num:
            print(num)


perfect_number1()